home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 351-375 / 359 / dice / dice.lzh / lib / amiga / exec_dcc.c < prev    next >
C/C++ Source or Header  |  1990-04-01  |  2KB  |  101 lines

  1.  
  2. /*
  3.  *  SYSTEM_DCC.C
  4.  *
  5.  *  (c)Copyright 1990, Matthew Dillon, All Rights Reserved
  6.  *
  7.  *  LoadSeg() and run a dcc program as this process.  ONLY DCC programs may
  8.  *  be run with this call.  The resident list is searched properly.
  9.  *
  10.  *  uses cli_DefaultStack if we are a process and the cli exists, else uses
  11.  *  a 4K stack.   Also modifies cli_CommandName and cli_Module temporarily.
  12.  */
  13.  
  14. #include <exec/types.h>
  15. #include <exec/ports.h>
  16. #include <exec/memory.h>
  17. #include <exec/execbase.h>
  18. #include <libraries/dosextens.h>
  19. #include <lib/bcpl.h>
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include <errno.h>
  23.  
  24. typedef struct CommandLineInterface CLI;
  25.  
  26. extern struct ExecBase    *SysBase;
  27.  
  28. extern void *AllocMem();
  29.  
  30. exec_dcc(cmd, args)
  31. char *cmd;
  32. char *args;
  33. {
  34.     long r;
  35.     long seg;
  36.     long unload = 0;
  37.     long stackSize;
  38.     char *stack;
  39.     CLI *cli = NULL;
  40.  
  41.     if ((seg = _SearchResident(cmd)) == NULL) {
  42.     unload = 1;
  43.     if ((seg = LoadSeg(cmd)) == NULL) {
  44.         long lock;
  45.         long oldLock;
  46.         if (lock = _SearchPath(cmd)) {
  47.         oldLock = CurrentDir(lock);
  48.         seg = LoadSeg(cmd);
  49.         CurrentDir(oldLock);
  50.         }
  51.     }
  52.     }
  53.     if (seg == NULL) {
  54.     errno = ENOTFND;
  55.     return(-1);
  56.     }
  57.  
  58.     /*
  59.      *    allocate stack, make call, deallocate stuff.  p.s. do not need the -4.
  60.      */
  61.  
  62.     stackSize = 4096;
  63.     if (SysBase->ThisTask->tc_Node.ln_Type != NT_TASK) {
  64.     cli = BTOC(((struct Process *)SysBase->ThisTask)->pr_CLI, CLI);
  65.  
  66.     if (cli)
  67.         stackSize = cli->cli_DefaultStack * 4;
  68.     }
  69.     if (stack = AllocMem(stackSize, MEMF_PUBLIC)) {
  70.     char *cmdName;
  71.     BPTR oldModule;
  72.     BPTR oldName;
  73.  
  74.     if (cli) {
  75.         cmdName = malloc(strlen(cmd) + 3);
  76.         strcpy(cmdName + 1, cmd);
  77.         strcat(cmdName, "\n");
  78.         cmdName[0] = strlen(cmd);
  79.  
  80.         oldModule = cli->cli_Module;
  81.         oldName   = cli->cli_CommandName;
  82.  
  83.         cli->cli_Module = seg;
  84.         cli->cli_CommandName = CTOB(cmdName);
  85.     }
  86.     r = _ExecSeg(seg, args, strlen(args), stack + stackSize - 4);
  87.  
  88.     FreeMem(stack, stackSize);
  89.  
  90.     if (cli) {
  91.         cli->cli_Module = oldModule;
  92.         cli->cli_CommandName = oldName;
  93.         free(cmdName);
  94.     }
  95.     }
  96.     if (unload)
  97.     UnLoadSeg(seg);
  98.     return(r);
  99. }
  100.  
  101.